table of contents
REQUEST_KEY(2) | Вызовы системы управления ключами Linux | REQUEST_KEY(2) |
ИМЯ¶
request_key - запрашивает ключ из системы управления ключами ядра
ОБЗОР¶
#include <keyutils.h> key_serial_t request_key(const char *type, const char *description, const char *callout_info, key_serial_t keyring);
ОПИСАНИЕ¶
request_key() подает запрос ядру на поиск ключа заданного type, который соответствует указанному описанию description и, если поиск успешен, присоединяет его к указанному keyring и возвращает его серийный номер.
Вызов request_key() выполняет рекурсивный поиск ключа во всех связках ключей в следующем порядке: связки каждой нити, присоединённые к вызвавшему процессу, связки, относящиеся к процессу и связки ключей сеанса.
Если request_key() вызван из программы, вызвавшей request_key() от имени какого-то другого процесс для генерации ключа, то в дальнейшем будет осуществлён поиск по связкам ключей этого другого процесса, используя его UID, GID, группы и контекст безопасности для контроля доступа.
Ключи в каждой связке ищутся и проверяются на совпадение до рекурсивного перехода в дочерние связки. Найдены могут быть только те ключи, которые доступны вызывающему для поиска, и поиск может осуществляться только в доступных для поиска связках ключей.
Если ключ не найден, то, если задан callout_info, эта функция попытается осуществить дальнейший поиск. В этом случае callout_info передаётся службе из пространства пользователя, такой как /sbin/request-key, для генерации ключа.
Если и она завершилась неудачно, то возвращается ошибка, и временный отрицательный ключ будет установлен в назначенную keyring. Он утратит силу через несколько секунд, но пока существует, все последующие вызовы request_key() будут приводить к ошибке.
Серийный номер keyring может задаваться действующей связкой ключей, на которую вызывающий имеет право на запись, или может быть задан специальным ID связки ключей:
- KEY_SPEC_THREAD_KEYRING
- Задаёт связку ключей нити вызывающего процесса.
- KEY_SPEC_PROCESS_KEYRING
- Задаёт связку ключей процесса.
- KEY_SPEC_SESSION_KEYRING
- Задаёт связку ключей сеанса вызывающего процесса.
- KEY_SPEC_USER_KEYRING
- Задаёт связку ключей по UID вызывающего процесса.
- KEY_SPEC_USER_SESSION_KEYRING
- Задаёт связку ключей по UID сеанса вызывающего процесса.
Если ключ создан, то неважно рабочий он или отрицательный, он будет вытеснять любой другой ключ с тем же типом и описанием из указанной keyring.
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ¶
При успешном выполнении возвращается request_key() возвращает серийный номер найденного ключа. В случае ошибки возвращается значение -1, а в errno устанавливается код соответствующей ошибки.
ОШИБКИ¶
- EACCES
- Изменение связки ключей пользователю недоступно.
- EINTR
- Запрос был прерван сигналом.
- EDQUOT
- Квота на ключи для данного пользователя была бы превышена, если бы этот ключ создался или был бы прицеплен в связку ключей.
- EKEYEXPIRED
- Найден просроченный ключ, и замена не может быть получена.
- EKEYREJECTED
- Попытка генерации нового ключа была отвергнута.
- EKEYREVOKED
- Найден отозванный ключ, и замена не может быть получена.
- ENOMEM
- Недостаточно памяти для создания ключа.
- ENOKEY
- Искомый ключ не найден.
КОМПОНОВКА¶
Хотя это и системный вызов Linux, его нет в libc, но его можно найти в libkeyutils. При сборке программы компоновщику нужно указать параметр -lkeyutils.
СМОТРИТЕ ТАКЖЕ¶
2010-02-25 | Linux |